/*
 * Copyright (c) 2022  by Junzhao
 * THIS FILE IS PART OF JAVASE Song Huongkang PROJECT
 * All Rights Reserved.
 */

package 线程池;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * @description  线程池
             背景：经常创建和销毁、使用量特别大的资源，比如并发情况下的线程，
                对性能影响很大。
             思路：提前创建好多个线程，放入线程池中，使用时直接获取，使用完
                放回池中。可以避免频繁创建销毁、实现重复利用。类似生活中的公共交
                通工具。
             好处：
                 提高响应速度（减少了创建新线程的时间）
                 降低资源消耗（重复利用线程池中线程，不需要每次都创建）
                 便于线程管理
                     corePoolSize：核心池的大小
                     maximumPoolSize：最大线程数
                     keepAliveTime：线程没有任务时最多保持多长时间后会终止
 * @author 俊昭
 * @date 2022/4/13
*/
public class PoolTest {
    public static void main(String[] args) {
        Test test = new Test();
        Demo demo = new Demo();
        // 提供指定线程数量的线程池
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        ThreadPoolExecutor s1 = (ThreadPoolExecutor) executorService;
        // 设置线程池的属性
//        System.out.println(executorService.getClass());
        s1.setCorePoolSize(15);// 设置核心线程数
//        s1.setKeepAliveTime(1000,);

        // 执行指定的线程的操作
        executorService.execute(test);// 适合Runnable
        executorService.submit(demo);// 适合Callable
        // 关闭连接池
        executorService.shutdown();
    }
}
class Test implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (i%2==0){
                System.out.println(Thread.currentThread().getName()+" "+i);
            }
        }
    }
}
class Demo implements Callable{
    @Override
    public Object call() throws Exception {
        for (int i = 0; i < 100; i++) {
            if (i%2==1){
            System.out.println(Thread.currentThread().getName()+" "+i);
            }
        }return null;
    }
}